package com.bear.线性结构.双链表;

/**
 * <简述>
 * <详细描述>
 *
 * @author LiuShanshan
 * @version $Id$
 */
public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        // 添加
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        doubleLinkedList.addByNo(new HeroNode22(1, "宋江"));
        doubleLinkedList.addByNo(new HeroNode22(4, "林冲"));
        doubleLinkedList.addByNo(new HeroNode22(2, "卢俊义"));
        doubleLinkedList.addByNo(new HeroNode22(3, "吴用"));
        doubleLinkedList.addByNo(new HeroNode22(3, "吴用2"));
        // 查
        doubleLinkedList.show();
        System.out.println("===========删===================");
        // 删
        doubleLinkedList.delete(2);
        System.out.println("===============查================");
        // 查
        doubleLinkedList.show();
    }
}

// 双向链表
class DoubleLinkedList{
    // head信息，在链表的第一个，不能变动
    private HeroNode22 HeroNode2Heard  = new HeroNode22(0, "");

    // 添加
    public void addByNo(HeroNode22 HeroNode2){
        // 添加辅助节点
        HeroNode22 temp = HeroNode2Heard;
        boolean isRep = false;
        while (true){
            // 当前节点next为null,退出
            if(temp.next == null){
                break;
            }
            // 当前节点next值的no值大于传入进来的HeroNode2中的no值（因为是从小到大排序），则退出
            if(temp.next.no > HeroNode2.no){
                break;
            }else if (temp.next.no == HeroNode2.no){
                isRep = true;
            }
            temp = temp.next;
        }
        if(isRep){
            System.out.println("有重复数据，报错.");
        }else{
            // 到了这里，temp中的next就应该放入参HeroNode2
            HeroNode2.next = temp.next;
            HeroNode2.pre = temp;
            temp.next = HeroNode2;
        }
    }

    // 删
    public void delete(int no){
        // 遍历双向链表，找到需要删除的数据temp
        HeroNode22 temp = HeroNode2Heard.next;
        while (true){
            if(temp.no == no){
                break;
            }
            temp = temp.next;
        }
        // 删除掉数据，并且将temp.pre.next = temp.next；temp.next.pre = temp.pre
        temp.pre.next = temp.next;
        temp.next.pre = temp.pre;
    }

    // 改  太简单了




    // 查
    public void show(){
        if(HeroNode2Heard.next == null){
            System.out.println("没有添加数据");
        }else{
            // 头信息不能动
            HeroNode22 temp = HeroNode2Heard.next;
            while (true){
                System.out.println(temp);
                if(temp.next == null){
                    break;
                }
                temp = temp.next;
            }
        }
    }
}

// 类
class HeroNode22 {
    // 编号
    public int no;
    // 名称
    public String name;
    // 指向下一个元素的对象
    public HeroNode22 next;
    // 指向上一个元素的对象
    public HeroNode22 pre;

    HeroNode22(int no, String name) {
        this.no = no;
        this.name = name;
    }


    @Override
    public String toString() {
        return "HeroNode2{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }
}


